<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>复制集合</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="mongo.connecting.auth.html">认证</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="mongo.connecting.mongos.html">Sharding</a></div>
 <div class="up"><a href="mongo.connecting.html">链接服务器</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="mongo.connecting.rs" class="section">
  <h2 class="title">复制集合</h2>
  <p class="para">
   要链接到一个复制，需要指定复制中的一个或多个成员，并使用
   <em>&quot;replicaSet&quot;</em> 选项指定复制的名字。多个服务器用逗号分割。
  </p>
  <div class="example" id="mongo.connecting.rs-example">
   <p><strong>Example #1 链接到一个复制</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;Using&nbsp;multiple&nbsp;servers&nbsp;as&nbsp;the&nbsp;seed&nbsp;list&nbsp;(prefered)<br /></span><span style="color: #0000BB">$m&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">MongoClient</span><span style="color: #007700">(</span><span style="color: #DD0000">"mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName"</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">//&nbsp;Using&nbsp;one&nbsp;server&nbsp;as&nbsp;the&nbsp;seed&nbsp;list<br /></span><span style="color: #0000BB">$m&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">MongoClient</span><span style="color: #007700">(</span><span style="color: #DD0000">"mongodb://rs1.example.com:27017"</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">"replicaSet"&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">"myReplSetName"</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">//&nbsp;Using&nbsp;multiple&nbsp;servers&nbsp;as&nbsp;the&nbsp;seed&nbsp;list<br /></span><span style="color: #0000BB">$m&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">MongoClient</span><span style="color: #007700">(</span><span style="color: #DD0000">"mongodb://rs1.example.com:27017,rs2.example.com:27017"</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">"replicaSet"&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">"myReplSetName"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
  <p class="para">
   驱动会查询数据库服务器列表，然后找出主服务器。如果可以成功的链接到指定的服务器至少一个，并且可以找到主服务器，链接就会成功。如果它无法链接指定的任何一个服务器，或者找不到主服务器，会抛出一个
   <a href="class.mongoconnectionexception.html" class="classname">MongoConnectionException</a> 类型的异常
  </p>
  <div class="tip"><strong class="tip">Tip</strong>
   <p class="para">
    你应该始终指定多个复制中的服务器。为了达到最大的可用性，你指定的服务器列表应该包含每一个数据中心的服务器至少一台。
   </p>
  </div>
  <p class="para">
   如果主服务器变为不可用，会有一台次要服务器通过投票算法自动提升为主服务器（除非“投票”无法选出主服务器）。在一段时间里
   （<a href="http://docs.mongodb.org/manual/faq/replica-sets/#how-long-does-replica-set-failover-take" class="link external">&raquo;&nbsp;20-60 秒</a>），链接无法进行写操作，此时写入会导致一个异常。
   到次要服务器的链接仍然可以提供读取功能。
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    默认的 <a href="mongo.readpreferences.html" class="link">读取偏好</a>
    是只从主服务器读取。在自动选择新的主服务器的时间里，读取操作也会失败。
   </p>
   <p class="para">
    对于要求很高的读取可用性的应用，推荐使用 <strong><code>MongoClient::RP_PRIMARY_PREFERRED</code></strong>
    读取偏好来确保主服务器出现问题的时候能正确的从次要服务器中读取。
   </p>
  </p></blockquote>
  <p class="para">
   当新的主服务器被选出后，尝试读写操作时，驱动会检测新的主服务器。然后链接到它，继续提供正常的功能。
  </p>
  <p class="para">
   次要服务器的健康状态每5秒（可以通过 <a href="mongo.configuration.html#ini.mongo.ping-interval" class="link">mongo.ping_interval</a>
   调整），或5秒后的下一个操作执行时检查一次。驱动会在连接服务器出现错误时重新检查配置。
  </p>
  <p class="para">
   复制集会每60秒（可以通过 <a href="mongo.configuration.html#ini.mongo.is-master-interval" class="link">mongo.is_master_interval</a>
   调整），或在w=1的写入操作发生错误的时候检查故障并尝试恢复。
  </p>

  <div class="caution"><strong class="caution">Caution</strong>
   <p class="para">
    次要服务器中的操作相比主服务器有一定延迟，因此如果使用
    <strong><code>MongoClient::RP_PRIMARY</code></strong>
    之外的读取偏好，你的程序就必须能够正确处理过时的数据。
   </p>
  </div>

  <p class="para">
   要了解更多关于复制集的信息，参考
   <a href="http://docs.mongodb.org/manual/replication/" class="link external">&raquo;&nbsp;core documentation</a>.
  </p>

  <div class="simplesect">
   <h3 class="title">参见</h3>
   <ul class="simplelist">
    <li class="member"><a href="mongo.readpreferences.html" class="xref">Read Preferences</a></li>
    <li class="member"><a href="mongo.writeconcerns.html" class="xref">Write Concerns</a></li>
   </ul>
  </div>

  <div class="simplesect">
   <h3 class="title">更新日志</h3>
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>版本</th>
       <th>说明</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>1.0.9</td>
       <td>
        添加了复制集支持，和自动错误恢复。
       </td>
      </tr>

     </tbody>
    
   </table>

  </div>

 </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="mongo.connecting.auth.html">认证</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="mongo.connecting.mongos.html">Sharding</a></div>
 <div class="up"><a href="mongo.connecting.html">链接服务器</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
